#include "fattester.h"	 
#include "usart.h"
#include "exfuns.h"
//#include "malloc.h"		  
#include "ff.h"
#include "string.h"
#include "rs232_interface.h"
//////////////////////////////////////////////////////////////////////////////////	 
//本程序只供学习使用，未经作者许可，不得用于其它任何用途
//ALIENTEK STM32开发板
//FATFS 测试代码	   
//正点原子@ALIENTEK
//技术论坛:www.openedv.com
//修改日期:2014/3/14
//版本：V1.0
//版权所有，盗版必究。
//Copyright(C) 广州市星翼电子科技有限公司 2009-2019
//All rights reserved									  
//////////////////////////////////////////////////////////////////////////////////

//为磁盘注册工作区	 
//path:磁盘路径，比如"0:"、"1:"
//mt:0，不立即注册（稍后注册）；1，立即注册
//返回值:执行结果
//uint8_t mf_mount(uint8_t* path,uint8_t mt)
//{		   
//	return f_mount(fs[0],(const TCHAR*)path,mt); 
//}
//打开路径下的文件
//path:路径+文件名
//mode:打开模式
//返回值:执行结果
uint8_t mf_open(uint8_t*path, uint8_t mode)
{
    uint8_t res;
    res = f_open(file, (const TCHAR*)path, mode);//打开文件夹
    return res;
}
//关闭文件
//返回值:执行结果
uint8_t mf_close(void)
{
    f_close(file);
    return 0;
}
//读出数据
//len:读出的长度
//返回值:执行结果
uint8_t mf_read(uint16_t len)
{
    uint16_t i, t;
    uint8_t res = 0;
    uint16_t tlen = 0;
    DBG_DEBUG("Read file data is:");
    for (i = 0; i < len / 512; i++)
    {
        res = f_read(file, fatbuf, 512, &br);
        if (res)
        {
            DBG_ERROR("Read Error:%d", res);
            break;
        }
        else
        {
            tlen += br;
            for (t = 0; t < br; t++)DBG("%c", fatbuf[t]);
        }
    }
    if (len % 512)
    {
        res = f_read(file, fatbuf, len % 512, &br);
        if (res)    //读数据出错了
        {
            DBG_ERROR("Read Error:%d", res);
        }
        else
        {
            tlen += br;
            for (t = 0; t < br; t++)DBG("%c", fatbuf[t]);
        }
    }
    if (tlen)DBG_DEBUG("Readed data len:%d", tlen);//读到的数据长度
    DBG_DEBUG("Read data over");
    return res;
}
//写入数据
//dat:数据缓存区
//len:写入长度
//返回值:执行结果
uint8_t mf_write(uint8_t*dat, uint16_t len)
{
    uint8_t res;

    DBG_DEBUG("Begin Write file...");
    DBG_DEBUG("Write data len:%d", len);
    res = f_write(file, dat, len, &bw);
    if (res)
    {
        DBG_ERROR("Write Error:%d", res);
    }
    else DBG_DEBUG("Writed data len:%d", bw);
    DBG_DEBUG("Write data over.");
    return res;
}

//打开目录
 //path:路径
//返回值:执行结果
uint8_t mf_opendir(uint8_t* path)
{
    return f_opendir(&dir, (const TCHAR*)path);
}
//关闭目录 
//返回值:执行结果
uint8_t mf_closedir(void)
{
    return f_closedir(&dir);
}



//显示剩余容量
//drv:盘符
//返回值:剩余容量(字节)
uint32_t mf_showfree(uint8_t *drv)
{
    FATFS *fs1;
    uint8_t res;
    uint32_t fre_clust = 0, fre_sect = 0, tot_sect = 0;
    //得到磁盘信息及空闲簇数量
    res = f_getfree((const TCHAR*)drv, (DWORD*)&fre_clust, &fs1);
    if (res == 0)
    {
        tot_sect = (fs1->n_fatent - 2) * fs1->csize;//得到总扇区数
        fre_sect = fre_clust * fs1->csize;			//得到空闲扇区数	   
#if _MAX_SS!=512
        tot_sect *= fs1->ssize / 512;
        fre_sect *= fs1->ssize / 512;
#endif	  
        if (tot_sect < 20480)//总容量小于10M
        {
            /* Print free space in unit of KB (assuming 512 bytes/sector) */
            DBG_INFO("磁盘总容量:%d KB"
                "可用空间:%d KB",
                tot_sect >> 1, fre_sect >> 1);
        }
        else
        {
            /* Print free space in unit of KB (assuming 512 bytes/sector) */
            DBG_INFO("磁盘总容量:%d MB"
                "可用空间:%d MB",
                tot_sect >> 11, fre_sect >> 11);
        }
    }
    return fre_sect;
}
//文件读写指针偏移
//offset:相对首地址的偏移量
//返回值:执行结果.
uint8_t mf_lseek(uint32_t offset)
{
    return f_lseek(file, offset);
}
//读取文件当前读写指针的位置.
//返回值:位置
uint32_t mf_tell(void)
{
    return f_tell(file);
}
//读取文件大小
//返回值:文件大小
uint32_t mf_size(void)
{
    return f_size(file);
}
//创建目录
//pname:目录路径+名字
//返回值:执行结果
uint8_t mf_mkdir(uint8_t*pname)
{
    return f_mkdir((const TCHAR *)pname);
}

//删除文件/目录
//pname:文件/目录路径+名字
//返回值:执行结果
uint8_t mf_unlink(uint8_t *pname)
{
    return  f_unlink((const TCHAR *)pname);
}

//修改文件/目录名字(如果目录不同,还可以移动文件哦!)
//oldname:之前的名字
//newname:新名字
//返回值:执行结果
uint8_t mf_rename(uint8_t *oldname, uint8_t* newname)
{
    return  f_rename((const TCHAR *)oldname, (const TCHAR *)newname);
}
//获取盘符（磁盘名字）
//path:磁盘路径，比如"0:"、"1:"  
//void mf_getlabel(uint8_t *path)
//{
//	uint8_t buf[20];
//	uint32_t sn=0;
//	uint8_t res;
//	res=f_getlabel ((const TCHAR *)path,(TCHAR *)buf,(DWORD*)&sn);
//	if(res==FR_OK)
//	{
//		rf_printf("\r\n磁盘%s 的盘符为:%s\r\n",path,buf);
//		rf_printf("磁盘%s 的序列号:%X\r\n\r\n",path,sn); 
//	}else rf_printf("\r\n获取失败，错误码:%X\r\n",res);
//}
//设置盘符（磁盘名字），最长11个字符！！，支持数字和大写字母组合以及汉字等
//path:磁盘号+名字，比如"0:ALIENTEK"、"1:OPENEDV"  
//void mf_setlabel(uint8_t *path)
//{
//	uint8_t res;
//	res=f_setlabel ((const TCHAR *)path);
//	if(res==FR_OK)
//	{
//		rf_printf("\r\n磁盘盘符设置成功:%s\r\n",path);
//	}else rf_printf("\r\n磁盘盘符设置失败，错误码:%X\r\n",res);
//} 

//从文件里面读取一段字符串
//size:要读取的长度
void mf_gets(uint16_t size)
{
    TCHAR* rbuf;
    rbuf = f_gets((TCHAR*)fatbuf, size, file);
    if (*rbuf == 0)return;//没有数据读到
    else
    {
        DBG_DEBUG("The String Readed Is:%s", rbuf);
    }
}
//需要_USE_STRFUNC>=1
//写一个字符到文件
//c:要写入的字符
//返回值:执行结果
uint8_t mf_putc(uint8_t c)
{
    return f_putc((TCHAR)c, file);
}
//写字符串到文件
//c:要写入的字符串
//返回值:写入的字符串长度
uint8_t mf_puts(uint8_t*c)
{
    return f_puts((TCHAR*)c, file);
}

